/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mmogle;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author goia
 */
public class Cliente{

    private String nickname;
    private int x = Math.abs(new Random().nextInt(100));
    private int y = Math.abs(new Random().nextInt(100));
    
    static String itens[] = { "espada" , "escudo", "porcao", "corda" , "amuleto" };
    static Socket socket;
    
    
    public static void enviarAoServidor( String mensagem ){

            if( socket == null ){
                try {
                    socket = new Socket("127.0.0.1", 6666);
                } catch (UnknownHostException ex) {
                    System.out.println( ex.getMessage() );
                } catch (IOException ex) {
                    System.out.println(ex.getMessage() );
                }
            }
            
            
        synchronized(socket){        
                try {
                    socket.getOutputStream().write(mensagem.getBytes());                    
                    System.out.println ( mensagem );
                } catch (IOException ex) {
                System.out.println(ex.getMessage());
                }
        }
    }

    public Cliente(String nickname){

        this.nickname = nickname;

        ExecutorService threadpool = Executors.newFixedThreadPool(5);

        /* Caminhando */
        threadpool.execute(new Runnable() {
            public void run() {
                while(true){
                    caminhar();
                    try {
                        Thread.sleep( new Random().nextInt(1000));
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });

        /* Obtendo um item */
        threadpool.execute(new Runnable() {
            public void run() {
                while(true){
                    obterItem();
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });


        /* Enviando uma mensagem */
        threadpool.execute(new Runnable() {
            public void run() {
                while(true){
                    enviarMensagem();
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });


        /* Recebendo mensagens */

        /* Obtendo o estado do ambiente */
        
    }

    public void caminhar(){
       enviarAoServidor( String.format("CHARMOV;%s;%d;%d\n" , nickname, ++x%1001, ++y%1001) );
    }

    public void obterItem(){
        enviarAoServidor( String.format("GETINV;%s;%s\n" , nickname, itens[ Math.abs(new Random().nextInt()) % 5 ] ) );
    }

    public void enviarMensagem(){
        String para     =  String.format("avatar%d", Math.abs( Math.max(1, new Random().nextInt(1000)) ) );
        String mensagem =  String.format("SNDMSG;%s;%s;olavc\n" , nickname, para);
        enviarAoServidor( mensagem );
    }

    public void receberMensagens(){


    }

    public void obterEstadoDoAmbiente(){
        
    }

    public static void main(String args[]){

        try{

            for( int i=1; i<=1000; i++){
                new Cliente("avatar"+i);

                if( i % 100 == 0 )
                    Thread.sleep(2000);
            }

        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }



}
